from colorama import Fore, Back, Style
import numpy as np
import math as math
import sys
import pandas as pd

from scipy.stats import bartlett
from factor_analyzer.factor_analyzer import calculate_kmo,calculate_bartlett_sphericity

# sys.path.append('D:/gitee/python-script-new/papertools/')


# 导入 pappertool 包中的 common_functions 模块
# from pappertools import common_functions


# 定义一个名为 dataset 的 NumPy 数组，其中包含了一个5x5的矩阵，表示一个包含5个变量的数据集，每列代表一个变量，每行代表一个观察值。
# 函数接受 数据集，并返回相关性矩阵。
""" dataset = np.array([[3,5,1,4,1],  
       [4,4,3,5,3],  
       [3,4,4,4,4],  
       [3,3,5,2,1],  
       [3,4,5,4,3]]) """

def corr(data):
    return np.corrcoef(data)

# dataset_corr = corr(dataset)



# 读取 CSV 文件
# dataset = pd.read_csv('dest/factor_analysis_data.csv')
# dataset = pd.read_csv('dest/20231018-180505_truncatedNormalDistribution.csv')

"""  np.corrcoef(dataset) 执行了相关性计算。np.corrcoef 是 NumPy 中用于计算相关性矩阵的函数。它接受一个数据集作为输入，并返回一个矩阵，其中包含了数据集中所有变量之间的皮尔逊相关系数。这个相关系数矩阵是一个对称矩阵，对角线上的元素始终为1，因为每个变量与自身的相关性是最高的。 """


# common_functions.save_data_to_excel(dataset_corr, 'dest','dataset_corr')

# bartResult = bartlett(*dataset)
# bartResult = bartlett(*dataset.T)

# scipy.stats 中的 bartlett 函数要求输入参数是每个变量的数据列表，而不是数据集的列。


def validityAnalysisFun(dataset):

    # 准备数据，将每列数据作为一个变量
    # dataTemp = [dataset[col] for col in dataset.columns]

    # print(Fore.BLUE + str(len(dataTemp)))

    # 执行 Bartlett's 球形性检验
    # stastic_v, bartlett_p_value = bartlett(*dataTemp)
    # calculate_bartlett_sphericity的检验结果和spss软件里效度检验结果的一致
    stastic_v, bartlett_p_value = calculate_bartlett_sphericity(dataset)

    # 用类库计算 KMO
    kmo_per_variable, kmo_v = calculate_kmo(dataset)    

    result = {}  # 创建一个字典来存储结果
      # 存储结果到字典
    result['stastic_v'] = stastic_v
    result['bartlett_p_value'] = bartlett_p_value
    result['KMO_per_variable'] = kmo_per_variable
    result['Overall_KMO'] = kmo_v

    return result


    """     print(stastic_v)
    print(Fore.RED + 'bartlett_p_value : ',bartlett_p_value)

    # 用类库计算 KMO
    kmo_per_variable, kmo_v = calculate_kmo(dataset)

    # 打印 KMO 值
    print(Fore.YELLOW + "KMO per variable:", kmo_per_variable)
    print("Overall KMO:", kmo_v)

    print(Fore.RESET) """